/***************************************************************************
 创建者: 华磊
 开始时间: 2019.4.27
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:把指令正则表达式匹配单独提取到本类，以实现和hmi复用
 * ＨＭＩ　ProgramDelegate::transferProgramTextToStructData() 这里面的正则表达式还没有实现复用
 ***************************************************************************/
#ifndef PROGRAMREGEXP_H
#define PROGRAMREGEXP_H
#include <QString>
#include <QRegExp>
#include "line.h"
#include "program.h"

class ProgramSimpleCheck;

class ProgramRegExp
{
public:
    ProgramRegExp();

public:

    /**
     * @brief patExtractInstructionType 获取字符串所属指令类型
     * @param str
     * @return
     */
    int patExtractInstructionType(QString str);


public:
    /**
     * @brief strToDouble   提取字符串中的double类型
     * @param in            输入字符串
     * @return
     */
    double strToDouble (QString in);
    double strCharsToDouble (QString in);
    /**
     * @brief strToInt  提取字符串中的整形
     * @param in        输入字符串
     * @return
     */
    int strToInt(QString in);
    /**
     * @brief strFilt   提取字符串中的字符
     * @param in        输入字符串
     * @return
     */
    QString strFilt(QString in);


    //----------------------------------------提取单条指令－－－－－－－－－－－－－－－－－－－－－－－－－－
    int patAxisMove(QString programStr,  Line &lineOut);
    int patMotion(QString programStr, QString forwardLineString, Line &lineOut);
    int patJump(QString programStr,Line &lineOut);
    int patLabel(QString programStr,Line &lineOut);
    int patIo(QString programStr,Line &lineOut);
    int patCall(QString programStr,Line &lineOut);
    int patIf(QString programStr, int lineIndex, Program &programOut);//需要结合上下文进行分析提取。
    int patSelect(QString programStr,int lineIndex, Program &programOut);//需要结合上下文进行分析提取。
    int patRun(QString programStr,Line &lineOut);
    int patFor(QString programStr,Line &lineOut);
    int patRegister(QString programStr,Line &lineOut);
    int patGRegister(QString programStr,Line &lineOut);
    int patPal(QString programStr,Line &lineOut);
    int patCoordinate(QString programStr,Line &lineOut);
    int patWait(QString programStr,Line &lineOut);
    int patWait_GR(QString programStr,Line &lineOut);
    int patErr(QString programStr,Line &lineOut);
    int patPause(QString programStr,Line &lineOut);
    int patAbort(QString programStr,Line &lineOut);
    int patEnd(QString programStr,Line &lineOut);
    int patUalm(QString programStr,Line &lineOut);
    int patMessage(QString programStr,Line &lineOut);
     int patOverride(QString programStr,Line &lineOut);
     int patTimer(QString programStr,Line &lineOut);
     int patRsr(QString programStr,Line &lineOut);
     int patAnnotation(QString programStr,Line &lineOut);
    /**
     * @brief patAddressTrpe    判断使用类型为直接还是间接（R【1】直接，R【R【1】】间接）
     * @param str               传入字符串
     * @return
     */
    ADDRESSING_TYPE patAddressType(QString str);
    /**
     * @brief patOperatorType   判断操作符的类型
     * @param str               传入字符串
     * @return
     */
    IF_OPERATOR_TYPE patOperatorType(QString str);

    int patGripper(QString programStr,Line &lineOut);

    int patModbusStart(QString programStr,Line &lineOut);

    int patModbusRead(QString programStr,Line &lineOut);

    int patModbusWrite(QString programStr, Line &lineOut);

    int patMoveMag(QString programStr,Line &lineOut);

    int patMoveFree(QString programStr,Line &lineOut);

    int patTcpStart(QString programStr,Line &lineOut);

    int patTcpRead(QString programStr,Line &lineOut);

    int patTcpWrite(QString programStr,Line &lineOut);

    int patMusic(QString programStr,Line &lineOut);

    int patSetOdom(QString programStr,Line &lineOut);

    // 匹配解析　CHARGING 充电指令
    int patCharging(QString programStr,Line &lineOut);

    // 匹配解析　LIFT 升降机构指令
    int patLift(QString programStr,Line &lineOut);

    // 匹配解析 LOAD_MAO 加载地图指令
    int patLoadMap(QString programStr,Line &lineOut);

    // 匹配解析　CHECKBATTERY  电量检测指令
    int patCheckBattery(QString programStr,Line &lineOut);
    // 匹配解析　WAIT_COMMAND  呼叫指令
    int patWaitCommand(QString programStr,Line &lineOut);

    // 匹配解析　ROBOT_MOVE  机械手控制指令
    int patRobotMove(QString programStr,Line &lineOut);

    // 匹配解析　ROLLER 滚筒指令
    int patRoller(QString programStr,Line &lineOut);

    int patVisionRun(QString programStr,Line &lineOut);
    int patVisionTrigger(QString programStr,Line &lineOut);
    int patVisionGetData(QString programStr,Line &lineOut);
    int patVisionClearData(QString programStr,Line &lineOut);

    int patTrackStart(QString programStr,Line &lineOut);
    int patTrackEnd(QString programStr,Line &lineOut);
    int patTrackGetData(QString programStr,Line &lineOut);

    int patRegPr(QString programStr,Line &lineOut);
    int patRegPl(QString programStr,Line &lineOut);

    int patWeldStart(QString programStr,Line &lineOut);//拓展新指令Fundation增加代码20191122hualei
    int patWeldEnd(QString programStr,Line &lineOut);
    int patWeave(QString programStr,Line &lineOut);
    int patWeaveEnd(QString programStr,Line &lineOut);
    //新指令20191130 ZHUHT
    int patTrackWeldTast(QString programStr,Line &lineOut);
    int patTrackWeldEnd(QString programStr,Line &lineOut);
    int patWatchDI(QString programStr,Line &lineOut);

    int patLaserCameraFetchPoint(QString programStr,Line &lineOut);
    int patLaserCameraControl(QString programStr,Line &lineOut);
    int patLaserCameraTrack(QString programStr,Line &lineOut);

     int patLaserScan(QString programStr,Line &lineOut);
     int patBufferMove(QString programStr,Line &lineOut);


private:
    void initCommonRegExp();//指令正则表达式涉及ｈｍｉ的　programcheck.cpp文件进行语法检查，同时涉及到ProgramDelegate::analysisＸＸＸＸInstruction()

    int analysisOffsetPr(QString programStr, QString &prIndexOut);
    int analysisAcc(QString programStr,int &accOut);


private:

    ProgramSimpleCheck *simpleCheck;
    //-----------------具体指令解析用正则表达式　　开始－－－－－－－－－
    /*******************************************
     * //指令正则表达式涉及ｈｍｉ的 ProgramDelegate::openInstructionEditViewSlot()
     * 同时涉及到ProgramDelegate::analysisＸＸＸＸInstruction(),
     * 还涉及到MoveFreeInstructionDelegate::recordDPointSlot(int recordType)
     * 还涉及到ProgramDelegate::guidanceMoveFreeSlot()
     * *****************************************/
    /**
     * @brief str_rx_num       常数匹配字符串
     */
    QString str_rx_num;
    /**
     * @brief str_rx_float      浮点数字符串
     */
    QString str_rx_float;
    /**
     * @brief str_rx_anyStr     所有字符的字符串
     */
    QString str_rx_anyStr;
    /**
     * @brief srt_rx_notes      注释
     */
    QString srt_rx_notes;
    /**
     * @brief str_rx_opt_DOWNTO_TO  循环ｆｏｒ
     */
    QString str_rx_opt_DOWNTO_TO;
    /**
     * @brief str_rx_opt_AND_OR     条件ＩＦ
     */
    QString str_rx_opt_AND_OR;
    /**
     * @brief str_rx_opt_ON_OFF     开关ＩＯ
     */
    QString str_rx_opt_ON_OFF;
    /**
     * @brief str_rx_opt_Operation  计算（全部运算符）
     */
    QString str_rx_opt_Operation;
    /**
     * @brief str_rx_opt_Operation_2    计算（只有加减运算符）
     */
    QString str_rx_opt_Operation_2;
    /**
     * @brief str_rx_opt_Match      比较
     */
    QString str_rx_opt_Match;
    /**
     * @brief str_rx_opt_Match_2    比较, 部分指令只能使用＝ 或者 <>
     */
    QString str_rx_opt_Match_2;
    /**
     * @brief str_rx_zkh_i          中括号值匹配格式： [ R[i] ] ，  [ i ]
     */
    QString str_rx_zkh_i;
    /**
     * @brief str_rx_zkh_ij         中括号值匹配格式： [ R[i], R[i] ] ，  [ i, j ] ,    [ 5, R[i] ]
     */
    QString str_rx_zkh_ij;
    /**
     * @brief str_rx_zkh_ijk        中括号值匹配格式： [ R[i], R[i], R[i] ],    [ i, j, k ] ,    [ i,  R[i], 6 ]
     */
    QString str_rx_zkh_ijk;
    /**
     * @brief str_rx_R_i            普通暂存器:  R[ R[i] ],    R[i]
     */
    QString str_rx_R_i;
    /**
     * @brief str_rx_PR_i           位置寄存器:  P[i] ,   PR[i],
     */
    QString str_rx_PR_i;
    /**
     * @brief str_rx_PR_ij          PR[i, j] ; 不同格式后面运算的条件不一样
     */
    QString str_rx_PR_ij;
    /**
     * @brief str_rx_PL_i           栈板寄存器:  PL[i] ,
     */
    QString str_rx_PL_i;
    /**
     * @brief str_rx_PL_ijk_val     PL[i, j, k] ;
     */
    QString str_rx_PL_ijk_val;
    /**
     * @brief str_rx_PL_ijk         PL[i, j, k] ;不同格式后面运算的条件不一样 ,    [*, R[1], 3 ]
     */
    QString str_rx_PL_ijk;
    /**
     * @brief str_UF_i              用户坐标系
     */
    QString str_UF_i;
    /**
     * @brief str_TF_i              工具坐标系
     */
    QString str_TF_i;
    /**
     * @brief str_rx_SR             字符串寄存器( 暂不支持 )
     */
    QString str_rx_SR;
    /**
     * @brief str_rx_io_i_all       IO  , 只有 IO 在前面的指令才被认为是 IO指令
     */
    QString str_rx_io_i_all;
    /**
     * @brief str_rx_TIMER          定时器： TIMER|TIMER_OVERFLOW
     */
    QString str_rx_TIMER;
    /**
     * @brief str_rx_ri_tmp1        R[i] 运算表达式
     */
    QString str_rx_ri_tmp1;
    /**
     * @brief str_rx_R_i_ALL        R[i] 运算表达式
     */
    QString str_rx_R_i_ALL;
    /**
     * @brief str_rx_R_i_opt        寄存器操作
     */
    QString str_rx_R_i_opt;
    /**
     * @brief str_rx_R_i_opt_2      条件判断寄存器比较
     */
    QString str_rx_R_i_opt_2;
    /**
     * @brief str_rx_PL_opt_tmp1    ＰＬ运算表达式
     */
    QString str_rx_PL_opt_tmp1;
    /**
     * @brief str_rx_PL_opt         ＰＬ操作
     */
    QString str_rx_PL_opt;
    /**
     * @brief str_rx_PL_opt_2       条件判断ＰＬ
     */
    QString str_rx_PL_opt_2;
    /**
     * @brief str_rx_PR_opt_tmp1    PR 运算表达式
     */
    QString str_rx_PR_opt_tmp1;
    /**
     * @brief str_rx_PR_i_opt      ＰＲ【ｉ】
     */
    QString str_rx_PR_i_opt;
    /**
     * @brief str_rx_PR_ij_opt     ＰＲ【ｉ，ｊ】
     */
    QString str_rx_PR_ij_opt;
    /**
     * @brief str_rx_PR_opt        ＰＲ－ＡＬＬ
     */
    QString str_rx_PR_opt;
    /**
     * @brief str_rx_io_i_a        IO 运算表达式
     */
    QString str_rx_io_i_a;
    /**
     * @brief str_rx_IO_a_opt       IO 运算表达式
     */
    QString str_rx_IO_a_opt;
    /**
     * @brief str_rx_IO_a_opt_2     IO 运算表达式
     */
    QString str_rx_IO_a_opt_2;
    /**
     * @brief str_rx_io_i_b         IO 运算表达式
     */
    QString str_rx_io_i_b;
    /**
     * @brief str_rx_IO_b_opt       IO 运算表达式
     */
    QString str_rx_IO_b_opt;
    /**
     * @brief str_rx_IO_b_opt_2     IO 运算表达式
     */
    QString str_rx_IO_b_opt_2;
    /**
     * @brief str_rx_IO_opt         IO 运算表达式
     */
    QString str_rx_IO_opt;
    /**
     * @brief str_rx_IO_opt_2       IO 运算表达式
     */
    QString str_rx_IO_opt_2;
    /**
     * @brief str_rx_io_i_c         IO 运算表达式
     */
    QString str_rx_io_i_c;
    /**
     * @brief str_rx_PULSE_opt      IO指令->脉冲，   // DO[R[3]]= PULSE , 1.2 sec,   DO[1]= PULSE
     */
    QString str_rx_PULSE_opt;
    /**
     * @brief str_rx_REG            寄存器指令
     */
    QString str_rx_REG;
    /**
     * @brief str_rx_IO             IO指令
     */
    QString str_rx_IO;
    /**
     * @brief str_rx_CALL           调用指令：CALL *
     */
    QString str_rx_CALL;
    /**
     * @brief str_rx_RUN           调用指令： RUN *
     */
    QString str_rx_RUN;
    /**
     * @brief str_rx_LBL           标签指令：LBL[ R[i] ] ， LBL[ i ] , 暂不支持注释
     */
    QString str_rx_LBL;
    /**
     * @brief str_rx_JMP           跳转指令：JMP LBL[ R[i] ]
     */
    QString str_rx_JMP;
    /**
     * @brief str_rx_USER_NUM
     */
    QString str_rx_USER_NUM;
    /**
     * @brief str_rx_USER_FRAME
     */
    QString str_rx_USER_FRAME;
    /**
     * @brief str_rx_UFRAME         用户坐标系指令
     */
    QString  str_rx_UFRAME;
    /**
     * @brief str_rx_TOOL_NUM
     */
    QString str_rx_TOOL_NUM;
    /**
     * @brief str_rx_TOOL_FRAME
     */
    QString str_rx_TOOL_FRAME;
    /**
     * @brief str_rx_UTOOL          工具坐标系指令
     */
    QString  str_rx_UTOOL;
    /**
     * @brief str_rx_motion_J       运动指令Ｊ
     */
    QString str_rx_motion_J;
    /**
     * @brief str_rx_motion_L       运动指令Ｌ
     */
    QString str_rx_motion_L;
    /**
     * @brief str_rx_motion_C       运动指令Ｃ
     */
    QString str_rx_motion_C;
    /**
     * @brief str_rx_motion_C_1     运动指令Ｃ
     */
    QString str_rx_motion_C_1;
    /**
     * @brief str_rx_motion_C_2     运动指令Ｃ
     */
    QString str_rx_motion_C_2;
    /**
     * @brief str_rx_motion_A       运动指令Ａ
     */
    QString str_rx_motion_A;
    /**
     * @brief str_rx_MOTION         所有运动指令
     */
    QString str_rx_MOTION;
    /**
     * @brief str_rx_PALL_HEAD      堆栈指令头
     */
    QString str_rx_PALL_HEAD;
    /**
     * @brief str_rx_PALL_MOTION    堆栈运动指令
     */
    QString str_rx_PALL_MOTION;
    /**
     * @brief str_rx_PALL_HAND      堆栈辅助点
     */
    QString str_rx_PALL_HAND;
    /**
     * @brief str_rx_PALL_END       堆栈结束
     */
    QString str_rx_PALL_END;
    /**
     * @brief str_rx_PALLETIZING    堆栈指令
     */
    QString str_rx_PALLETIZING;
    /**
     * @brief str_rx_wait_delay     等待指令 : WAIT 10.5sec    , WAIT R [ 1 ] ,   WAIT R [ 2 ] <> 1 , WAIT R [ R [ 1 ]] >= 200
     */
    QString str_rx_wait_delay;
    /**
     * @brief str_rx_wait_else      等待指令 :TIMEOUT LBL [ 1 ] ,
     */
    QString str_rx_wait_else;
    /**
     * @brief str_rx_WAIT           等待综合指令
     */
    QString str_rx_WAIT;
    /**
     * @brief str_rx_requirement    判断条件
     */
    QString str_rx_requirement;
    /**
     * @brief str_rx_proc           处理
     */
    QString str_rx_proc;
    /**
     * @brief str_rx_IF             IF 指令  , 部分条件只能用( <> = )判断符号
     */
    QString str_rx_IF;
    /**
     * @brief str_rx_SELECT_start   SELECT 指令头
     */
    QString str_rx_SELECT_start;
    /**
     * @brief str_rx_SELECT_mid     SELECT 指令中间部分
     */
    QString str_rx_SELECT_mid;
    /**
     * @brief str_rx_SELECT_end     ＳＥＬＥＣＴ尾
     */
    QString str_rx_SELECT_end;
    /**
     * @brief str_rx_SELECT         ｓｅｌｅｃｔ指令
     */
    QString str_rx_SELECT;
    /**
     * @brief str_rx_FOR            ｆｏｒ指令
     */
    QString str_rx_FOR;
    /**
     * @brief str_rx_ENDFOR         ｅｎｄＦｏｒ指令
     */
    QString  str_rx_ENDFOR;

    /**
     * @brief str_rx_MOTION_BASE_JLA        基本ｍｏｔｉｏｎ指令（ＪＬＡ）
     */
    QString str_rx_MOTION_BASE_JLA;
    /**
     * @brief str_rx_MOTION_JLA                 ｍｏｔｉｏｎ指令
     */
    QString str_rx_MOTION_JLA;
    /**
     * @brief str_rx_MOTION_SKIP_JL         ｍｏｔｉｏｎ指令包含跳转指令
     */
    QString str_rx_MOTION_SKIP_JL;
    /**
     * @brief str_rx_MOTION_BASE_C2        基本Ｃ指令(Ｐ[i]\PR[i])
     */
    QString str_rx_MOTION_BASE_C2;
    /**
     * @brief str_rx_MOTION_BASE_C1      基本Ｃ指令(C P[i])
     */
    QString str_rx_MOTION_BASE_C1;
    /**
     * @brief str_rx_MOTION_C1              C指令(C P[i])
     */
    QString str_rx_MOTION_C1;
    /**
     * @brief str_rx_MOTION_C2              C指令(P[i])
     */
    QString str_rx_MOTION_C2;

    QString str_rx_MOTION_JLCA;

    QString str_rx_MOTION_SKIP_JLC;
    /**
     * @brief str_rx_MOTION_SKIP_C      C指令(P[i])包含ｓｋｉｐ指令
     */
    QString str_rx_MOTION_SKIP_C;
//    /**
//     * @brief str_rx_MORE                       任意匹配
//     */
//    QString str_rx_MORE;
    /**
     * @brief str_rx_MSKIP                      ｓｋｉｐ匹配
     */
    QString str_rx_MSKIP;
    /**
     * @brief str_rx_MADD1                  ａｃｃ、ｐｔｈ等指令匹配
     */
    QString str_rx_MADD1;
    /**
     * @brief str_rx_MADD2                  ｏｆｆｓｅｔ等指令匹配
     */
    QString str_rx_MADD2;
    /**
     * @brief str_rx_MOTION_P_JLA
     */
    QString str_rx_MOTION_P_JLA;
    /**
     * @brief str_rx_MOTION_P_C1
     */
    QString str_rx_MOTION_P_C1;
    /**
     * @brief str_rx_MOTION_P_C2
     */
    QString str_rx_MOTION_P_C2;

    /**
     * @brief str_rx_pause          pause指令匹配表达式
     */
    QString str_rx_pause;
    /**
     * @brief str_rx_abort          ａｂｏｒｔ指令匹配表达式
     */
    QString str_rx_abort;
    /**
     * @brief str_rx_end            ｅｎｄ指令匹配表达式
     */
    QString str_rx_end;
    /**
     * @brief str_rx_ualm           ｕａｌｍ指令匹配表达式
     */
    QString str_rx_ualm;
    /**
     * @brief str_rx_timer              timer指令匹配表达式
     */
    QString str_rx_timer_cmd;

    QString str_rx_timer_value;

    QString str_rx_timer;
    /**
     * @brief str_rx_override           override指令匹配表达式
     */
    QString str_rx_override;
    /**
     * @brief str_rx_message            message指令匹配表达式
     */
    QString str_rx_message;
    /**
     * @brief str_rx_rsr                    rsr指令匹配表达式
     */
    QString str_rx_rsr;
    //2017-7-24  夹抓
    QString str_rx_gripper_active;
    QString str_rx_gripper_set;
    QString str_rx_gripper_wait;

    /**
     * @brief str_rx_modbusStart    MODBUS_START 指令正则表达式字符串
     */
    QString str_rx_modbusStart;

    /**
     * @brief str_rx_modbusRead     MODBUS_READ 指令正则表达式字符串
     */
    QString str_rx_modbusRead;

    /**
     * @brief str_rx_modbusWrite    MODBUS_WRITE 指令正则表达式字符串
     */
    QString str_rx_modbusWrite;

    /**
     * @brief str_rx_moveMag       MOVE_MAG 指令正则表达式字符串
     */
    QString str_rx_moveMag;

    /**
     * @brief str_rx_moveFree       MOVE_FREE 指令正则表达式字符串
     */
    QString str_rx_moveFree;
    /**
     * @brief str_rx_waitCommand       WAIT_COMMAND 等待呼叫
     */
    QString str_rx_waitCommand;

    /**
     * @brief str_rx_tcpStart       TCP_START 指令正则表达式字符串
     */
    QString str_rx_tcpStart;

    /**
     * @brief str_rx_tcpRead        TCP_READ 指令正则表达式字符串
     */
    QString str_rx_tcpRead;

    /**
     * @brief str_rx_tcpWrite       TCP_WRITE 指令正则表达式字符串
     */
    QString str_rx_tcpWrite;

    /**
     * @brief str_rx_music          MUSIC 指令正则表达式字符串
     */
    QString str_rx_music;

    /**
     * @brief str_rx_setOdom        SET_ODOM 重置里程计指令正则表达式字符串
     */
    QString str_rx_setOdom;

    /**
     * @brief str_rx_charging       CHARGING 充电指令正则表达式字符串
     */
    QString str_rx_charging;

    /**
     * @brief str_rx_liftMechanism  LIFT 升降机构指令正则表达式字符串
     */
    QString str_rx_liftMechanism;

    /**
     * @brief str_rx_loadMap        LOAD_MAP 加载地图指令正则表达式字符串
     */
    QString str_rx_loadMap;

    /**
     * @brief str_rx_checkBattery       CHECKBATTERY 电量检测
     */
    QString str_rx_checkBattery;

    /**
     * @brief str_rx_RobotMove          机械手控制
     */
    QString str_rx_RobotMove;

    /**
     * @brief str_rx_Roller             滚筒指令
     */
    QString str_rx_Roller;

//    QString str_rx_VisionRun; 不要使用成员变量，直接写到函数内部
//    QString str_rx_VisionGetData;
//    QString str_rx_VisionClearData;
//    QString str_rx_VisionTrigger;
};

#endif // PROGRAMREGEXP_H
